#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# 检查 root 权限
check_root() {
    if [ "$(id -u)" -ne 0 ]; then
        echo -e "${RED}错误：请使用 root 用户或通过 sudo 运行此脚本${NC}"
        exit 1
    fi
}

# 错误处理
die() {
    echo -e "${RED}[错误] $1${NC}" >&2
    exit 1
}

# 获取本机IP地址（改进版）
get_local_ip() {
    # 尝试多种方法获取IP，优先选择非内部地址
    local ip=$(ip -o -4 addr show | awk '{print $4}' | cut -d'/' -f1 | grep -vE '^(127\.|192\.168|10\.|172\.1[6-9]|172\.2[0-9]|172\.3[0-1])' | head -n1)
    
    # 如果没有找到非内部IP，则返回第一个找到的IP
    if [ -z "$ip" ]; then
        ip=$(hostname -I | awk '{print $1}')
    fi
    
    echo "$ip"
}

# 系统检测（增强版）
detect_system() {
    # 检测群辉DSM（支持多版本）
    if [ -f /etc/synoinfo.conf ] && [ -d /var/packages ]; then
        echo "dsm"
        return
    fi

    # 检测FNOS系统（兼容新旧版本）
    if grep -q "ID=debian" /etc/os-release && { [ -d /vol1 ] || [ -d /vol2 ]; }; then
        echo "fnos"
        return
    fi

    # 检测OpenWRT
    if [ -f /etc/openwrt_release ] || [ -f /etc/openwrt_version ]; then
        echo "openwrt"
        return
    fi

    # 检测通用Linux发行版
    if [ -f /etc/os-release ]; then
        source /etc/os-release
        case $ID in
            ubuntu|debian|centos|fedora|arch|almalinux|rocky)
                echo "linux"
                return ;;
        esac
    fi

    echo "unknown"
}

# 动态获取Docker目录（增强版）
get_docker_dir() {
    local system_type=$1
    local dir=""

    case $system_type in
        "dsm")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /volume* -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /volume1/docker
            [ -z "$dir" ] && dir="/volume1/docker"
            ;;
        "fnos")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /vol*/1000 -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /vol1/1000/docker
            [ -z "$dir" ] && dir="/vol1/1000/docker"
            ;;
        "openwrt")
            # OpenWRT系统通常使用/opt目录
            dir="/opt/docker"
            ;;
        *)
            # 其他系统直接使用 /opt/docker
            dir="/opt/docker"
            ;;
    esac

    # 清理路径中的特殊字符
    dir=$(echo "$dir" | tr -d '\n\r')
    
    # 创建目录（如果不存在）
    mkdir -p "$dir" || die "无法创建目录 $dir"
    
    echo "$dir"
}

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -tuln | grep -q ":$port "; then
        echo -e "${YELLOW}警告: 端口 $port 已被占用，可能会造成冲突${NC}"
        read -p "是否继续? [y/N]: " choice
        if [[ ! "$choice" =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
}

# 检查kvrocks端口是否被占用
check_kvrocks_port() {
    local port=6666
    if netstat -tuln | grep -q ":$port "; then
        echo -e "${YELLOW}警告: KVrocks端口 $port 已被占用，可能会造成冲突${NC}"
        read -p "是否继续? [y/N]: " choice
        if [[ ! "$choice" =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
}

# 主安装流程
install_katelyatv() {
    # 获取动态目录
    local system_type=$(detect_system)
    local data_dir=$(get_docker_dir "$system_type")
    local katelyatv_dir="${data_dir}/katelyatv"
    local kvrocks_data_dir="${katelyatv_dir}/data"

    # 用户输入
    echo -e "${BLUE}请输入KatelyaTV配置信息${NC}"
    read -p "访问端口 [默认3000]: " port
    read -p "管理员用户名 [默认admin]: " username
    read -p "管理员密码 [默认admin111]: " password
    
    port=${port:-3000}
    username=${username:-admin}
    password=${password:-admin111}

    # 验证端口
    if ! [[ "$port" =~ ^[0-9]+$ ]] || [ "$port" -lt 1 ] || [ "$port" -gt 65535 ]; then
        die "无效端口: $port"
    fi
    
    # 检查端口占用
    check_port "$port"
    check_kvrocks_port

    # 创建数据目录
    echo -e "${BLUE}[信息] 创建数据目录...${NC}"
    mkdir -p "$kvrocks_data_dir" || die "无法创建数据目录 $kvrocks_data_dir"

    # 清理旧容器
    echo -e "${BLUE}[信息] 清理旧容器...${NC}"
    docker rm -f katelyatv katelyatv-kvrocks 2>/dev/null

    # 创建网络
    echo -e "${BLUE}[信息] 创建Docker网络...${NC}"
    docker network create katelyatv-network 2>/dev/null || echo -e "${YELLOW}[警告] 网络可能已存在${NC}"

    # 部署KVrocks
    echo -e "${BLUE}[信息] 启动KVrocks容器...${NC}"
    echo -e "${BLUE}[信息] KVrocks数据目录: ${kvrocks_data_dir}${NC}"
    docker run -d \
        --name katelyatv-kvrocks \
        --network katelyatv-network \
        --restart always \
        -p "6666:6666" \
        -v "${kvrocks_data_dir}:/data" \
        apache/kvrocks:latest || die "KVrocks容器启动失败"

    # 等待KVrocks启动
    echo -e "${BLUE}[信息] 等待KVrocks启动...${NC}"
    sleep 5

    # 部署KatelyaTV
    echo -e "${BLUE}[信息] 启动KatelyaTV容器...${NC}"
    docker run -d \
        --name katelyatv \
        --network katelyatv-network \
        --restart always \
        -p "${port}:3000" \
        -e USERNAME="$username" \
        -e PASSWORD="$password" \
        -e NEXT_PUBLIC_STORAGE_TYPE=kvrocks \
        -e KVROCKS_URL="redis://katelyatv-kvrocks:6666" \
        -e NEXT_PUBLIC_ENABLE_REGISTER=true \
        ghcr.io/katelya77/katelyatv:latest || die "KatelyaTV容器启动失败"

    # 验证部署
    echo -e "${BLUE}[信息] 验证部署...${NC}"
    sleep 8
    if ! docker ps | grep -q katelyatv; then
        echo -e "${RED}容器启动失败，查看日志:${NC}"
        docker logs katelyatv | head -n 20
        die "KatelyaTV容器启动失败"
    fi

    # 显示结果
    local ip=$(get_local_ip)
    echo -e "\n${GREEN}========== 部署成功 ==========${NC}"
    echo -e "系统类型: ${YELLOW}$(echo $system_type | tr '[:lower:]' '[:upper:]')${NC}"
    echo -e "访问地址: ${GREEN}http://${ip}:${port}${NC}"
    echo -e "用户名: ${YELLOW}${username}${NC}"
    echo -e "密码: ${YELLOW}${password}${NC}"
    echo -e "KVrocks数据目录: ${YELLOW}${kvrocks_data_dir}${NC}"
    echo -e "KVrocks端口: ${YELLOW}6666${NC}"
    echo -e "\n管理命令:"
    echo -e "查看KatelyaTV日志: ${YELLOW}docker logs -f katelyatv${NC}"
    echo -e "查看KVrocks日志: ${YELLOW}docker logs -f katelyatv-kvrocks${NC}"
    echo -e "停止服务: ${YELLOW}docker stop katelyatv katelyatv-kvrocks${NC}"
    echo -e "重启服务: ${YELLOW}docker restart katelyatv${NC}"
}

# 初始检查
check_docker() {
    if ! command -v docker &>/dev/null; then
        die "请先安装Docker"
    fi
    echo -e "${GREEN}[√] Docker已安装 ($(docker --version | cut -d ' ' -f 3 | tr -d ','))${NC}"
}

# 主函数
main() {
    echo -e "${GREEN}
    ██╗  ██╗ █████╗ ████████╗███████╗██╗     ██╗   ██╗████████╗██╗   ██╗
    ██║ ██╔╝██╔══██╗╚══██╔══╝██╔════╝██║     ██║   ██║╚══██╔══╝██║   ██║
    █████╔╝ ███████║   ██║   █████╗  ██║     ██║   ██║   ██║   ██║   ██║
    ██╔═██╗ ██╔══██║   ██║   ██╔══╝  ██║     ██║   ██║   ██║   ██║   ██║
    ██║  ██╗██║  ██║   ██║   ███████╗███████╗╚██████╔╝   ██║   ╚██████╔╝
    ╚═╝  ╚═╝╚═╝  ╚═╝   ╚═╝   ╚══════╝╚══════╝ ╚═════╝    ╚═╝    ╚═════╝
    ${NC}"

    check_root
    check_docker
    install_katelyatv
}

main "$@"